//
// Created by twetec on 25-8-17.
//

#ifndef NETWORK_PROBE_PROBE_HANDLE_SQLSERVER_PROBE_TASK_H
#define NETWORK_PROBE_PROBE_HANDLE_SQLSERVER_PROBE_TASK_H

#include <coroutine>
#include <future>

#include <network_prober/database/memory_db_holder.h>

namespace network_prober::probe
{
/**
 * SQLServer IPv4
 */
// class SQLServerProbeIPv4 : public std::enable_shared_from_this<SQLServerProbeIPv4>
// {
// public:
//     /**
//      *  观测
//      */
//     void probe();
//
//     /**
//      * 观测完毕时回调
//      */
//     void setOnProbedCallback(std::function<void(std::int64_t)> callback);
//
//     /**
//      * @param interface 网口地址
//      * @param target 目标地址
//      */
//     SQLServerProbeIPv4(
//         std::string_view interface,
//         std::string_view target,
//         std::uint32_t port,
//         std::string_view userName,
//         std::string_view password,
//         std::string_view databaseName,
//         std::string_view queryStatement
//     );
//
//     ~SQLServerProbeIPv4();
//
// private:
//     std::string m_interface;
//     std::string m_target;
//     std::uint32_t m_port;
//     std::string m_userName;
//     std::string m_password;
//     std::string m_databaseName;
//     std::string m_queryStatement;
//     std::function<void(std::int64_t)> m_onProbedCallback;
//     std::chrono::time_point<std::chrono::steady_clock> m_probeStartTime;
//     std::future<void> m_onProbedCallbackFuture;
// };

/**
 *  观测处理
 */
class HandleSQLServerProbeIPv4Awaiter
{
public:
    HandleSQLServerProbeIPv4Awaiter(const database::ProbeTaskModel& probeTask);

    /**
     * 任务是否需要执行await_suspend()
     * @return false 表示未准备好，需要暂停
     */
    bool await_ready();
    /**
     *  在协程暂停后，执行的方法
     * @param handle 协程promise对象句柄
     */
    void await_suspend(std::coroutine_handle<> handle);
    /**
     *  co_await 输出的值
     *  这里用于返回延迟的时间
     */
    std::int64_t await_resume();

private:
    std::string m_interface;
    std::string m_target;
    std::uint32_t m_port;
    std::string m_userName;
    std::string m_password;
    std::string m_databaseName;
    std::string m_queryStatement;
    std::int64_t m_delay{-1};
};


/**
 * SQLServer IPv6
 */
// class SQLServerProbeIPv6 : public std::enable_shared_from_this<SQLServerProbeIPv6>
// {
// public:
//     /**
//      *  观测
//      */
//     void probe();
//
//     /**
//      * 观测完毕时回调
//      */
//     void setOnProbedCallback(std::function<void(std::int64_t)> callback);
//
//     /**
//      * @param interface 网口地址
//      * @param target 目标地址
//      */
//     SQLServerProbeIPv6(
//         std::string_view interface,
//         std::string_view target,
//         std::uint32_t port,
//         std::string_view userName,
//         std::string_view password,
//         std::string_view databaseName,
//         std::string_view queryStatement
//     );
//     ~SQLServerProbeIPv6();
//
// private:
//     std::string m_interface;
//     std::string m_target;
//     std::uint32_t m_port;
//     std::string m_userName;
//     std::string m_password;
//     std::string m_databaseName;
//     std::string m_queryStatement;
//     std::function<void(std::int64_t)> m_onProbedCallback;
//     std::chrono::time_point<std::chrono::steady_clock> m_probeStartTime;
//     std::future<void> m_onProbedCallbackFuture;
// };

/**
 *  观测处理
 */
class HandleSQLServerProbeIPv6Awaiter
{
public:
    HandleSQLServerProbeIPv6Awaiter(const database::ProbeTaskModel& probeTask);

    /**
     * 任务是否需要执行await_suspend()
     * @return false 表示未准备好，需要暂停
     */
    bool await_ready();
    /**
     *  在协程暂停后，执行的方法
     * @param handle 协程promise对象句柄
     */
    void await_suspend(std::coroutine_handle<> handle);
    /**
     *  co_await 输出的值
     *  这里用于返回延迟的时间
     */
    std::int64_t await_resume();

private:
    std::string m_interface;
    std::string m_target;
    std::uint32_t m_port;
    std::string m_userName;
    std::string m_password;
    std::string m_databaseName;
    std::string m_queryStatement;
    std::int64_t m_delay{-1};
};
}



#endif //NETWORK_PROBE_PROBE_HANDLE_SQLSERVER_PROBE_TASK_H
